package rsj.service.test;

import com.alibaba.fastjson.JSON;
import com.rlyy.aibase.utils.base.MapNode;
import com.rlyy.aibase.utils.base.Node;
import com.rlyy.aibase.utils.base.TableNode;
import com.rlyy.aibase.utils.base.ThinkException;
import common.exec.RsjIllegalArgueException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rsj.api.product.entity.TestQueryParam;

import java.util.Objects;

/**
 * 列表查询模板方法接口（直接调用usageReport()方法，子类实现具体查询逻辑）
 *
 * @author yuanqinglong
 * @since 2021/3/4 9:21
 */
public interface ITestTemplateMethod {

    Logger logger = LoggerFactory.getLogger(ITestTemplateMethod.class);

    /**
     * 我司
     */
    String MY_COMPANY = "01";
    /**
     * 供应商
     */
    String SUPPLIER = "02";
    /**
     * 数据测试
     */
    String DATA_TESTING = "03";


    /**
     * 查询-使用情况
     *
     * @param testQueryParam 参数
     * @param logType        环境（01：我司，02：供应商，03：数据测试）
     * @return 使用情况
     */
    default MapNode usageReport(TestQueryParam testQueryParam, String logType) {
        TableNode tableNode;
        Node node;
        try {
            testQueryParam.setLogType(logType);
            tableNode = this.queryTableByPage(testQueryParam);
            node = this.countStatistic(testQueryParam);
        } catch (ThinkException e) {
            logger.error("线下测试报表查询异常，参数：{}", JSON.toJSONString(testQueryParam), e);
            throw new RsjIllegalArgueException("查询失败");
        }
        return new MapNode().putNode("List", tableNode.toJson()).putNode("Count", node.value());
    }


    /**
     * 数统计
     *
     * @param testQueryParam 参数
     * @return {@link Node}
     */
    default Node countStatistic(TestQueryParam testQueryParam) {
        return new Node();
    }


    /**
     * 导出产品当前表
     *
     * @param testQueryParam 参数
     * @return {@link TableNode}
     */
    default TableNode queryTableByPage(TestQueryParam testQueryParam) {
        return new TableNode();
    }





    /**
     * 生成查询sql
     *
     * @param testQueryParam 参数
     * @return sql
     */
    String generateQueryStatement(TestQueryParam testQueryParam);


    /**
     * 生成统计个数sql
     *
     * @param testQueryParam 参数
     * @return sql
     */
    String generateCountStatement(TestQueryParam testQueryParam);


    /**
     * 动态拼接条件
     *
     * @param sql            sql
     * @param testQueryParam 查询参数
     * @return sql
     */
    static String dynamicSplicingConditions(String sql, TestQueryParam testQueryParam) {
        if (StringUtils.isNotBlank(testQueryParam.getOrgName())) {
            sql += " AND cust_sname LIKE '%"+testQueryParam.getOrgName()+ "%'";
        }
        if (Objects.nonNull(testQueryParam.getStatDate())) {
            sql += " AND log_time <= '"+testQueryParam.getStatDate()+"'";
        }
        return sql;
    }
}
